

function ajax(options) {
    const { type, url, data = {}, dataType = 'json', async = true, success } = options;


    // 判断传参是否正确
    // 判断type 请求方式只能是get / post
    if (type.toLowerCase() !== 'get' && type.toLowerCase() !== 'post') throw new Error('请求方式type暂时支持get或者post这两种方式');
    // 判断url
    if (typeof url !== 'string') throw new Error('请求的接口路径错误');
    // 判断data
    if (Object.prototype.toString.call(data) !== '[object Object]') throw new Error('前端携带的数据data必须是对象')
    // dataType
    if (dataType !== 'json' && dataType !== 'string') throw new Error('返回值类型dataType只能是json或者string')
    // async
    if (typeof async !== 'boolean') throw new Error('ajax同步异步只能用布尔值表示')

    let params = '';
    for (let key in data) {
        params += `${key}=${data[key]}&`;
    }
    params = params.substr(0, params.length - 1);


    const p = new Promise((resolve, reject) => {
        const xhr = new XMLHttpRequest();
        // 判断请求方式
        if (type.toLowerCase() === 'get') {
            xhr.open('get', url + '?' + params, async);
            xhr.send();
        }

        else if (type.toLowerCase() === 'post') {
            xhr.open('post', url, async);
            xhr.setRequestHeader('content-type', 'application/x-www-form-urlencoded');
            xhr.send(params);
        }


        xhr.onreadystatechange = function () {
            if (xhr.readyState === 4 && xhr.status === 200) {
                let data = xhr.responseText;
                // 判断返回值的类型
                if (dataType.toLowerCase() === 'json') {
                    data = JSON.parse(data);
                }
                resolve(data) ;
            }
        }
    })

    return p

}